package com.example.codegenerator.Utils;

import com.example.codegenerator.Constant.TemplateConstant;
import com.example.codegenerator.po.Column;
import com.example.codegenerator.Constant.PathConstant;
import com.example.codegenerator.po.Entity;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.io.*;
import java.util.*;

@Component
public class FreemarkerUtils {
    @Autowired
    Configuration configuration;

    /**
     * 批量生成
     */
    public void generator(Entity entity) throws TemplateException, IOException {
        // 生成Entity
        generatorEntity(entity, TemplateConstant.EntityTemplate);

        // 生成Mapper
        generatorEntity(entity, TemplateConstant.mapperTemplate);
    }

    /**
     * 生成实体类
     */
    public void generatorEntity(Entity entity, String templateName) throws IOException, TemplateException {
        // 构建数据模型
        HashMap<String, Object> map = new HashMap<>();
        map.put("entity", entity);
        // 获取模板
        Template template = getTemplate(templateName);

        // 获取文件存储路径
        String fileName = entity.entityName + TemplateConstant.javaSuffix;
        String path = PathConstant.diskPath + fileName;

        // 构建输出流，这里直接存储到path路径，也可以更改文件输出方式
        FileOutputStream outputStream = new FileOutputStream(new File(path));
        BufferedWriter out = new BufferedWriter(new OutputStreamWriter(outputStream));

        // 生成代码
        template.process(map, out);
    }

    /**
     * 生成mapper代码
     */
    public void generatorMapper(Entity entity, String templateName) throws IOException, TemplateException {
        // 构建数据模型
        HashMap<String, Object> map = new HashMap<>();
        map.put("entity", entity);

        // 获取模板
        Template template = getTemplate(templateName);

        // 获取文件存储路径
        String fileName = entity.entityName + "Mapper" + TemplateConstant.javaSuffix;
        String path = PathConstant.diskPath + fileName;

        // 构建输出流，这里直接存储到path路径，也可以更改文件输出方式
        FileOutputStream outputStream = new FileOutputStream(new File(path));
        BufferedWriter out = new BufferedWriter(new OutputStreamWriter(outputStream));

        // 生成代码
        template.process(map, out);
    }

    /**
     * 生成Service接口代码
     */
    public void generatorService(Entity entity, String templateName) throws IOException, TemplateException {
        // 构建数据模型
        HashMap<String, Object> map = new HashMap<>();
        map.put("entity", entity);

        // 获取模板
        Template template = getTemplate(templateName);

        // 获取文件存储路径
        String fileName = entity.entityName + "Service" + TemplateConstant.javaSuffix;
        String path = PathConstant.diskPath + fileName;

        // 构建输出流，这里直接存储到path路径，也可以更改文件输出方式
        FileOutputStream outputStream = new FileOutputStream(new File(path));
        BufferedWriter out = new BufferedWriter(new OutputStreamWriter(outputStream));

        // 生成代码
        template.process(map, out);
    }

    /**
     * 生成ServiceImpl实现类代码
     */
    public void generatorServiceImpl(Entity entity, String templateName) throws IOException, TemplateException {
        // 构建数据模型
        HashMap<String, Object> map = new HashMap<>();
        map.put("entity", entity);

        // 获取模板
        Template template = getTemplate(templateName);

        // 获取文件存储路径
        // 拓展只需要修改此处文件名
        String fileName = entity.entityName + "ServiceImpl" + TemplateConstant.javaSuffix;
        String path = PathConstant.diskPath + fileName;

        // 构建输出流，这里直接存储到path路径，也可以更改文件输出方式
        FileOutputStream outputStream = new FileOutputStream(new File(path));
        BufferedWriter out = new BufferedWriter(new OutputStreamWriter(outputStream));

        // 生成代码
        template.process(map, out);
    }

    /**
     * 生成Controller代码
     */
    public void generatorController(Entity entity, String templateName) throws IOException, TemplateException {
        // 构建数据模型
        HashMap<String, Object> map = new HashMap<>();
        map.put("entity", entity);

        // 获取模板
        Template template = getTemplate(templateName);

        // 获取文件存储路径
        // 拓展只需要修改此处文件名
        String fileName = entity.entityName + "Controller" + TemplateConstant.javaSuffix;
        String path = PathConstant.diskPath + fileName;

        // 构建输出流，这里直接存储到path路径，也可以更改文件输出方式
        FileOutputStream outputStream = new FileOutputStream(new File(path));
        BufferedWriter out = new BufferedWriter(new OutputStreamWriter(outputStream));

        // 生成代码
        template.process(map, out);
    }


    /**
     * 获取模板
     */
    private Template getTemplate(String templateFilename) throws IOException {
        return configuration.getTemplate(templateFilename);
    }
}
